package listener;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/*
* 在线人数统计
* 当有新的session对象创建时，人数+1
* 当有session对象销毁时，人数-1
 */
@WebListener //监听器注释
public class OnlineListener implements HttpSessionListener {
   /*
   *   需要把计算的结果存到ServletContext中，这样可以在不同的浏览器中转换，都能看到最新的登录人数
   *  不能存在sessionz作用域中这个方法只能记录在一个浏览器中用户的变化，不能更新）
        *httpSessionEvent.getSession().setAttribute("onlineNumber",onlineNumber);
    */

   //监听会话创建
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

        //获取servletContext对象
        ServletContext sc= httpSessionEvent.getSession().getServletContext();
        System.out.println("会话创建");
        Object historyNum=sc.getAttribute("historyNum");//历史访问人数
        Object onlineNum=sc.getAttribute("onlineNum");//在线人
        if(historyNum==null)//第一次访问程序
        {
            sc.setAttribute("historyNum",1);
        } else {   //不是第一次访问的人数+1
            Integer h_num=(Integer) historyNum;
            sc.setAttribute("historyNum",h_num+1);
        }
        if(onlineNum==null)//第一个在线的人
        {
            sc.setAttribute("onlineNum",1);
        } else  { //增加在线人数
            Integer on_num=(Integer) onlineNum;
            sc.setAttribute("onlineNum",on_num+1);
        }
    }

    //监听会话销毁
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("会话销毁");
        ServletContext sc=httpSessionEvent.getSession().getServletContext();
        //利用会话销毁次数实现在线人数的更新
        Integer on_num_des=(Integer) sc.getAttribute("onlineNum");
        sc.setAttribute("onlineNum",on_num_des-1);
        System.out.println("会话销毁，人数减1");
    }
}
